package luadb

// //Tx .
// type Tx struct {
// 	*core.Tx
// 	*core.Stmt
// }

// //Transaction 事务
// func checkTx(l *lua.LState) *Tx {
// 	ud := l.CheckUserData(1)
// 	if v, ok := ud.Value.(*Tx); ok {
// 		return v
// 	}
// 	l.ArgError(1, "transaction expected")
// 	return nil
// }

// //newTx .
// func newTx(l *lua.LState) int {
// 	val := l.Get(1)
// 	db := "default"
// 	if val != lua.LNil {
// 		db = val.String()
// 	}

// 	engine, ok := boss.dbs[db]
// 	if !ok {
// 		l.Push(lua.LString("No this database:" + db))
// 		return 1
// 	}

// 	dtx, err := engine.DB().Begin()
// 	if err != nil {
// 		l.Push(lua.LString(err.Error()))
// 		return 1
// 	}
// 	if dtx == nil {
// 		l.Push(lua.LString("tx is null"))
// 		return 1
// 	}

// 	tx := new(Tx)
// 	tx.Tx = dtx

// 	ud := l.NewUserData()
// 	ud.Value = tx
// 	l.SetMetatable(ud, l.GetTypeMetatable(luaTxTypeName))
// 	l.Push(ud)
// 	return 1
// }

// func txCommit(l *lua.LState) int {
// 	tx := checkTx(l)
// 	err := tx.Commit()
// 	if err != nil {
// 		l.Push(lua.LString(err.Error()))
// 		return 1
// 	}
// 	return 0
// }
// func txRollback(l *lua.LState) int {
// 	tx := checkTx(l)
// 	err := tx.Rollback()
// 	if err != nil {
// 		l.Push(lua.LString(err.Error()))
// 		return 1
// 	}
// 	return 0
// }

// func txPrepare(l *lua.LState) int {
// 	tx := checkTx(l)
// 	sql := l.CheckString(2) //表名 或sql语句
// 	num := l.GetTop()
// 	if num > 2 {
// 		table := l.CheckTable(3)
// 		sql, _ = genPrepareSQL(sql, table)
// 	}
// 	var err error
// 	tx.Stmt, err = tx.Prepare(sql)
// 	if err != nil {
// 		l.Push(lua.LString(err.Error()))
// 		return 1
// 	}
// 	return 0
// }

// func txExec(l *lua.LState) int {
// 	tx := checkTx(l)
// 	msql := l.CheckString(2)

// 	var err error
// 	var res sql.Result
// 	if tx.Stmt == nil {
// 		tx.Stmt, err = tx.Prepare(msql)
// 		if err != nil {
// 			l.Push(lua.LString(err.Error()))
// 			return 1
// 		}
// 		res, err = tx.Stmt.Exec()
// 	} else {
// 		res, err = tx.Stmt.Exec(msql)
// 	}

// 	if err != nil {
// 		l.Push(lua.LString(err.Error()))
// 		return 1
// 	}

// 	LastInsertId, _ := res.LastInsertId()
// 	Affected, _ := res.RowsAffected()
// 	tab := l.NewTable()
// 	tab.RawSetString("LastInsertId", lua.LNumber(LastInsertId))
// 	tab.RawSetString("Affected", lua.LNumber(Affected))
// 	l.Push(tab)
// 	return 0
// }

// func txInsert(l *lua.LState) int {
// 	tx := checkTx(l)
// 	//tableName := l.CheckString(2)
// 	table := l.CheckTable(2)

// 	fields := make([]interface{}, table.MaxN())
// 	for i := range fields {
// 		val := table.RawGetInt(i + 1)
// 		if val == lua.LNil {
// 			fields[i] = nil
// 			continue
// 		}
// 		fields[i] = val
// 	}

// 	res, err := tx.Stmt.Exec(fields...)
// 	if err != nil {
// 		l.Push(lua.LString(err.Error()))
// 		return 1
// 	}

// 	//popAll(l)

// 	LastInsertId, _ := res.LastInsertId()
// 	Affected, _ := res.RowsAffected()
// 	tab := l.NewTable()
// 	tab.RawSetString("LastInsertId", lua.LNumber(LastInsertId))
// 	tab.RawSetString("Affected", lua.LNumber(Affected))
// 	l.Push(tab)
// 	return 1

// }

// func txQuery(l *lua.LState) int {
// 	tx := checkTx(l)
// 	sql := l.CheckString(2)
// 	rows, err := tx.Stmt.Query(sql)
// 	if err != nil {
// 		l.Push(lua.LString(err.Error()))
// 		return 1
// 	}
// 	ud := l.NewUserData()
// 	ud.Value = rows
// 	l.SetMetatable(ud, l.GetTypeMetatable(luaRowsTypeName))
// 	l.Push(ud)
// 	return 1
// }
